home *** CD-ROM | disk | FTP | other *** search
/ Black Crawling Systems Archive Release 1.0 / Black Crawling Systems Archive Release 1.0 (L0pht Heavy Industries, Inc.)(1997).ISO / blackcrwl / elctrnic / steppers.txt < prev    next >
Text File  |  1996-08-24  |  27KB  |  551 lines

  1.  
  2.  
  3.  
  4.                     CONTROL OF STEPPING MOTORS
  5.                                 By
  6.                          Douglas W. Jones
  7.                         University of Iowa
  8.                         jones@cs.uiowa.edu
  9.  
  10.                           COPYRIGHT 1990
  11.                 originally posted on rec.railroad
  12.  
  13.                            REVISED 1995
  14.  
  15.                    All rights reserved.  Permision
  16.                    is hereby given to make copies
  17.                    for personal use and to archive
  18.                    or distribute copies of this
  19.                    material on the Internet and
  20.                    connected networks.  All other
  21.                    copying of this material is
  22.                    prohibited.
  23.  
  24.  
  25.                            Introduction
  26.  
  27. Stepping motors can be viewed as electric motors without commutators.
  28. Typically, all windings in the motor are part of the stator, and the
  29. rotor is either a permanent magnet or, in the case of variable reluctance
  30. motors, a toothed block of some magnetically soft material.  All of the
  31. commutation must be handled externally by the motor controller, and
  32. typically, the motors and controllers are designed so that the motor may
  33. be held in any fixed position as well as being rotated one way or the
  34. other.  Most stepping motors can be stepped at audio frequencies,
  35. allowing them to spin quite quickly, and with an appropriate controller,
  36. they may be started and stopped "on a dime" at controlled orientations.
  37.  
  38. Stepping motors come in two varieties, permanent magnet and variable
  39. reluctance (there are also hybrid motors, which are permanent magnet
  40. motors from the controller's point of view).  Lacking a label on the
  41. motor, you can generally tell the two apart by feel when no power is
  42. applied.  Permanent magnet motors tend to "cog" as you twist the rotor
  43. with your fingers, while variable reluctance motors almost spin freely
  44. (although they may cog slightly because of residual magnetization in
  45. the rotor).  You can also distinguish between the two varieties with
  46. an ohm meter.  Variable reluctance motors usually have three (sometimes
  47. four) windings, with a common return, while permanent magnet motors
  48. usually have two independent windings, without center taps in bipolar
  49. motors, with center taps in unipolar motors.
  50.  
  51.    Variable Reluctance         Bipolar             Unipolar
  52.  
  53.                                                        |
  54.       ---/\/\/\-                                       |
  55.                 |           ---/\/\/\---         ---/\/ \/\---
  56.       ---/\/\/\-|--
  57.                 |           ---/\/\/\---         ---\/\_/\/---
  58.       ---/\/\/\-                                       |
  59.                                                        |
  60.  
  61. Stepping motors come in a wide range of angular resoluation.  The
  62. coarsest motors typically run around 90 degrees per step, while high
  63. resolution permanent magnet motors are commonly able to handle 1.8
  64. degrees per step.  With an appropriate controller, a permanent magnet
  65. motor can be run in half-steps, and some controllers can handle
  66. "microsteps", smaller fractional steps.
  67.  
  68.  
  69.                       Basic Control Circuits
  70.  
  71. I see no advantage to using commercial stepping motor controllers.  I've
  72. had an easy time with the direct software control of the 3 or 4 windings
  73. in the typical stepping motor, using an 8 bit parallel output port to run
  74. two motors.
  75.  
  76. What follows is a simple plan for computer control of a stepping motor.
  77. First, we'll assume that the DC resistance of the windings is all you need
  78. to limit the current through the motor.  Some motors have very low
  79. resistance windings and need external current limiters, for example, series
  80. resistors or (better yet) current limiting power transistors.
  81.  
  82. The following circuit, duplicated once per winding, will generally suffice
  83. to control even a fairly large unipolar stepping motor.
  84.  
  85.                                                       + motor power
  86.                                                       | ( 5 to 24 volts )
  87.                                                 ------|  poorly regulated
  88.                                        diode   |      |
  89.                       logic power     to kill  |    -----
  90.                            +5        inductive -   | one of the
  91.                            |           surge   ^   | motor windings
  92.                            |          1N4002   |    -----
  93.                            | pull up           |      |
  94.              -----------   R resistor           ------|
  95.             |   Open    |  | 470 ohm                  | C
  96.   Logic in  | Collector |  |                        -----
  97.        -----|   Buffer  |--------------------------| power darlington
  98.             | (SN7407)  |                        B | transistor (NPN)
  99.             |           |                           -----  RCA SK 3180
  100.              -----------                              | E
  101.                                                       |
  102.                                                       |
  103.                                                       - system ground
  104.  
  105. Each winding in the motor requires one darlington transistor, one diode,
  106. one resistor, and one sixth of the SN7407 chip.  The same circuit will
  107. work solenoids, model railroad uncoupling magnets, and other similar
  108. things.  Because the transistors are being used for switching, they
  109. don't dissapate much heat, and I just bolted all of them to a single
  110. aluminum bar as a heatsink (with insulating washers where needed).
  111. This is not expensive!
  112.  
  113. For small low-current motors (below a few hundred milliamps per winding),
  114. consider using the Signetics ULN2003 chip.  This eliminates the need for
  115. the darlington transistor, and can be directly driven by TTL or CMOS
  116. logic.
  117.  
  118. If your motor has three windings, typically with 4 wires because one wire
  119. is common to all three windings, it is probably a variable reluctance
  120. stepping motor.  The common wire goes to the positive supply.  Assuming
  121. positive logic, when the input is 1, the winding is on, and the following
  122. outputs would rotate the motor:
  123.  
  124.   Winding 1 100100100100100100100100100
  125.   Winding 2 010010010010010010010010010
  126.   Winding 3 001001001001001001001001001
  127.              time --->
  128.  
  129. There are also variable reluctance stepping motors with 4 windings and 5
  130. wires.  The principle for driving these motors is the same as that for the
  131. three winding variety, but it becomes important to work out the correct
  132. order to energise the windings to make the motor step nicely.
  133.  
  134. If your motor has two center tapped windings, typically with 6 wires, it's
  135. probably a unipolar permanent magnet stepping motor.  The center taps are
  136. connected to the positive supply (possibly through a current limiter), and
  137. we'll call the windings 1a, 1b, 2a, and 2b, where each of the two windings has
  138. ends a and b.  Assuming positive logic on the 4 outputs needed to control
  139. this motor:
  140.  
  141.   Winding 1a 1000100010001000  11000001110000011100000111
  142.   Winding 1b 0010001000100010  00011100000111000001110000
  143.   Winding 2a 0100010001000100  01110000011100000111000001
  144.   Winding 2b 0001000100010001  00000111000001110000011100
  145.               time --->
  146.  
  147. Note that the two halves of each winding are never energized at the same
  148. time.  The left sequence shown above will rotate a permanent magnet one
  149. step at a time, while the right sequence will rotate the motor one half
  150. step at a time.  Half stepping works because if two windings are energized
  151. at the same time, the motor will stop in a position midway between the
  152. two.
  153.  
  154. Things are more complex with bipolar permanent magnet motors that have two
  155. windings with no center taps.  You can distinguish such a 4 wire motor
  156. form the 3 pole 4 wire variable reluctance motors with an ohmmeter.  In
  157. that case, the simple drive circuit outlined above won't work, but the
  158. control logic outlined above is still applicable.  Antonio Raposo
  159. (ajr@cybill.inesc.pt) suggested the following circuit for each winding
  160. of such a motor:
  161.  
  162.          0------0----0----------------0----0------0------ positive bus
  163.          |      |    |                |    |      |
  164.      2K2 R      |C   |                |    |C     R 2K2
  165.          |   B ---   -                -   --- B   |
  166.    BD679 0----|NPN|  ^ 1N4007  1N4007 ^  |NPN|----0 BD679
  167.          |     ---   |                |   ---     |
  168.          |      |E   |                |    |E     |C
  169.    +5    |      |    |   ---------    |    |      |   +5
  170.     |    0--|<--0----0--| Winding |---0----0-->|--0    |
  171. 2K2 R    |  1N5408   |   ---------    |   1N5408  |    R 2K2
  172.     |   C|           |                |           |C   |
  173.     | B ---          -                -          --- B |
  174.  a -0--|NPN|         ^ 1N4007  1N4007 ^         |NPN|--0- b
  175.         ---          |                |          ---
  176.         E| BD679     |                |    BD679  |E
  177.          |           |                |           |
  178.          0-----------0----------------0-----------0------ negative bus
  179.                                                           and logic ground
  180.  
  181. The a and b inputs to the above circuit can be driven by open collector
  182. TTL outputs as in the first and simpler circuit.  The motor winding will
  183. be energised if exactly one of the a and b inputs is high and exactly one
  184. of them is low.  If both are low, both pull-down transistors will be off.
  185. If both are high, both pull-up transistors will be off.  The a and b ends
  186. of the control circuit can be driven exactly like the a and b ends of the
  187. center tapped winding documented above.  Note the 4 diodes connecting
  188. the ends of the motor windings to the positive and negative bus.  These
  189. are normally reverse biased, but when the motor winding is turned off
  190. or reversed, they will be forward biased for as long as it takes to
  191. kill the current through the winding.
  192.  
  193. The UDN2998W Dual full bridge chip gives you an H-bridge circuit such
  194. as the above in a power SIP package.  Another chip some people recommend
  195. is the L298 (given the similarity in numbers, these may be the same chip
  196. from different sources).  This is rated at up to 2 amps at 48 volts.
  197. The companion L297 contains drive logic.  The one warning when using this
  198. chip set is that the switching times are fast enough that commonplace
  199. protection diodes (1N400X) aren't fast enough.  Instead, use a diode
  200. such as the BYV27.
  201.  
  202.  
  203.                          Current Limiting
  204.  
  205. Before talking about software, a note on powering stepping motors is
  206. in order.  Small stepping motors, such as those used for head
  207. positioning on floppy disk drives, are usually driven at a low DC
  208. voltage and the current through the motor windings is usually limited
  209. by the internal resistance of the winding.  High torque motors, on the
  210. other hand, are frequently built with very low resistance windings;
  211. when driven by any reasonable supply voltage, these motors usually
  212. require external current limiting circuitry.
  213.  
  214. Microstepping, where the control system positions the motor rotor
  215. between half steps, also requires external current limiting circuitry.
  216. For example, to position the rotor 1/4 of the way from one step to
  217. another, it might be necessary to run one motor winding at full current
  218. while the other is run at approximately 1/3 of that current.
  219.  
  220. Another reason to run a motor from a supply voltage higher than that
  221. needed to produce the rated current in the motor windings is to obtain
  222. faster rise times when a motor winding is turned on.  The rates of
  223. current rise and fall when a winding is turned on and off limit the
  224. speed at which the motor can be stepped, and as a result, higher
  225. operating voltages are required for higher stepping rates.
  226.  
  227. The easiest to understand current limiter is a series resistor.  Most
  228. motor manufacturers recommended this approach in their literature up
  229. until the early 1980's.  The typical circuit used was as follows
  230. (illustrated with one center-tapped motor winding):
  231.  
  232.                          + 24
  233.                     _____|_____
  234.                    |     |     |   R1 limits the current through the motor
  235.                    |     R1    |
  236.                   _|_    |    _|_  Diodes allow current to flow when
  237.                   /|\    |    /|\    transistors are turned off
  238.                    |     |     |
  239.                   R2  /\/\/\/  R3  R2 and R3 (optional) help drop current
  240.                    |__|     |__|     on turn-off
  241.                       |     |
  242.                       X     X      Transistors to control which side
  243.                                      of winding is powered.
  244.  
  245. Given the rated maximum current through each winding and the supply
  246. voltage, the resistance and wattage of R1 are easy to compute.  R2
  247. and R3, if they are included, pose more interesting problems.  The
  248. resistance of these depends on the maximum voltage the control
  249. transistors can handle.  For example, if your supply voltage is 24
  250. volts, and your transistors are rated at 75 volts, the drop across
  251. R2 and R3 can be as much as 51 volts without harming the transistors.
  252. If the operating current through the motor is 1.5 amps, R2 and R3
  253. can be 34 ohm resistors.  Note that an interesting alternative would
  254. be to use zener diodes in place of R2 and R3.
  255.  
  256. Figuring the average wattage of R2 and R3 is a wonderful exercise in
  257. dynamics, particularly when you consider that the inductance of the
  258. motor windings is generally undocumented and varies with the rotor
  259. position (which determines the reluctance of the magnetic circuit).
  260.  
  261. A couple of high wattage power resistors can cost more than a pair
  262. of power transistors plus a heat sink plus a small fan for forced air
  263. cooling!  Furthermore, it is easy to design a linear current regulator
  264. that will give faster rise times than a current limiting resistor.
  265. Consider the following:
  266.  
  267.                          +
  268.          ________________|
  269.         |                |
  270.        Zener (Vref)      R1
  271.         |                |
  272.         |__________|/__|/   PNP Power transistor to control
  273.         |          |\  |\   current through winding.
  274.         |        diode   |
  275.         R4               |
  276.         |             /\/\/\/  One center tapped winding of motor
  277.         |             |     |
  278.        gnd            X     X  Transistors to control which side
  279.                                of winding is powered.
  280.  
  281. If R1 is 0.5 ohms and the forward voltage drop across the diode and
  282. emitter is 0.6 volts, a 1.7 volt zener diode will give a current of
  283. 1 amp through R1.  Zener diodes in this voltage range are available,
  284. and can be connected as shown to provide the required reference
  285. voltage for a fixed current regulator.
  286.  
  287. R4 in the above figure must be sized in terms of the current gain of
  288. the PNP transistor so that sufficient current flows through R1 and R2
  289. in series to allow the transistor to conduct the rated motor current.
  290.  
  291. Alternatively, Vref can be provided by an ADC for a variable current
  292. application, as required for microstepping.  In this case, things are
  293. complicated by the fact that Vref is measured relative to the motor
  294. supply, and this is typically only minimally regulated.
  295.  
  296. Note that the protection diodes have been omitted from the above figure,
  297. and also note that series resistors (R2 and R3 in the previous figure)
  298. are extremely useful in this context.  Without these resistors, the fall
  299. time of the current when a motor winding is turned off is determined only
  300. by the low internal resistance of the winding plus the 0.5 ohm series
  301. resistor.
  302.  
  303. Linear current regulation wastes energy, and for high current motors,
  304. it requires expensive power transistors, heat sinks and forced air
  305. cooling.  In the above example, assuming that the DC resistance of the
  306. stepping motor winding is on the order of 4 ohms, the transistor will
  307. be dropping 20 volts at 1 amp, requiring it to dissapate 20 watts.
  308. Even R1 gets hot; for a 1 amp motor, half an ohm will dissapate
  309. 0.5 watts, but this loss is harder to avoid than the large loss in the
  310. transistor itself.
  311.  
  312. Use of a switching regulator can avoid dissapating large amounts of power
  313. in the transistor.  Such a regulator works by sensing the current through
  314. the winding and turning the control transistor off when the current is
  315. over the set point.  When the control transistor is off, the current
  316. coasts back to the supply through the protection diodes until it falls
  317. enough that the control circuit can turn it back on.
  318.  
  319. In the abstract, the necessary circuit looks like this:
  320.  
  321.                          + 24
  322.                   _______|
  323.                  |       |
  324.                 Vref     R1
  325.                  |       |
  326.                 b|_    __|a
  327.                    Comp  |
  328.                 _____|   |
  329.                |         |
  330.                |      /\/\/\/  One center tapped winding of motor
  331.     Motor      |      |     |
  332.     Control - And --- X --- X  Transistors to control which side
  333.     Signals                    of winding is powered.
  334.  
  335. The protection diodes and any additonal dropping resistors R2 and R3
  336. have been omitted from the above diagram, but they are necessary!
  337.  
  338. The comparitor compares the voltage at point a (the downstream side of
  339. R1) with the voltage at point b, the reference voltage, provided by a
  340. zener diode or DAC.  When Va > Vb, the current is too low, so the
  341. output of the comparitor allows the control transistors to turn on, if
  342. required by the motor control signals.  When Va < Vb, the current is
  343. too high, so the comparitor, through the and gate, turns off both
  344. transistors.
  345.  
  346. This circuit must oscillate, so there must be some time delay and
  347. possibly some hysteresis in the feedback loop.  In this circuit, the RL
  348. time constant of R1 and the motor winding, in series, provides the
  349. necessary delay.  It may be necessary to add hysteresis, for example,
  350. by using the comparitor output to perturb the reference voltage.
  351.  
  352. The sizes of the dropping resistors R2 and R3 pose interesting problems
  353. when a switching regulator is used.  If no dropping resistor is used
  354. with a motor with very low internal resistance, a switching regulator
  355. can be an extremely efficient way to run a stepping motor, but it
  356. doesn't allow fast stepping because the current through the windings
  357. will take a long time to decay.  If R2 and R3 are high, fast stepping
  358. is possible, but large amounts of power will be dissapated in R2 and R3,
  359. leading to inefficient operation.
  360.  
  361. Computing the wattage of R2 and R3 is quite easy compared to the previous
  362. examples.  Given the two RL time constants that govern the current rise
  363. and fall through R1, the duty cycle for current in either R2 or R3 can
  364. be computed, and as long as the current through R1 varies only slightly,
  365. this lets you compute the peak average power dissapated in R2 and R3.
  366.  
  367. Note that the switching control system can be quite simple.  Neither
  368. the comparitor nor the and gate imply the use of integrated circuits!
  369. The following outline illustrates how simple things can get:
  370.  
  371.                          +
  372.            ______________|
  373.           |              |
  374.           |              R1
  375.          Vref            |
  376.           |      ________|
  377.           |_|/_|/        |  PNP transistor to do comparison
  378.             |\ |\        |
  379.           diode  |       |
  380.      Open        R4   /\/\/\/  One center tapped winding of motor
  381.      Collector   |    |
  382.      Control ____|__|/  NPN Darlington pair to control half the winding.
  383.      Signal         |\
  384.                       |
  385.                      Gnd
  386.  
  387. I haven't actually built a circuit based on the above, and I don't
  388. know if the switching delays in the transistors plus the RL time
  389. constant of the coil will be enough to guarantee that it oscillates!
  390. If it doesn't, Vref will need to be perturbed by a small amount
  391. depending on the state of the PNP transistor.  Unfortunately, straight
  392. resistive feedback won't do because the sign is wrong.
  393.  
  394.  
  395.                          Control Software
  396.  
  397. Now, here's the code to make your motor run as if you had one of those
  398. fancy stepper controllers.  I've used Pascal for no particular reason.
  399. This code assumes only one motor, and it assumes it's attached to the
  400. least significant bits of one parallel output port.  In practice, it's
  401. nice to have one parallel output port per motor, although with a bit of
  402. care, you can use the high bits of a port for another motor or other
  403. applications, and you can multiplex one port to handle multiple motors.
  404. (The July 1993 issue of Model Railroader has plans for a parallel port
  405. multiplexer circuit for IBM PC systems in it).
  406.  
  407. Assume these declarations and values for a three winding variable
  408. reluctance motor:
  409.  
  410.      const maxstep = 2;
  411.            steps = 3;
  412.      var   steptab: array [0..maxstep] of integer;
  413.            step: integer;
  414.            motor: file of integer; { this is the I/O port for the motor }
  415.      begin
  416.            step := 0;
  417.            steptab[0] = 1; { binary 001 }
  418.            steptab[1] = 2; { binary 010 }
  419.            steptab[2] = 4; { binary 100 }
  420.            write( motor, steptab[step] );
  421.  
  422. Assume these declarations and values for a permanent magnet motor, whether
  423. the windings are center tapped (allowing a simple drive circuit) or not
  424. (requiring a messy drive circuit like the one outlined above):
  425.  
  426.      const maxstep = 3;
  427.            steps = 4;
  428.      var   steptab: array [0..maxstep] of integer;
  429.            step: integer;
  430.            motor: file of integer; { this is the I/O port for the motor }
  431.      begin
  432.            step := 0;
  433.            steptab[0] = 1; { binary 0001 }
  434.            steptab[1] = 4; { binary 0100 }
  435.            steptab[2] = 2; { binary 0010 }
  436.            steptab[3] = 8; { binary 1000 }
  437.            write( motor, steptab[step] );
  438.  
  439. Assume these declarations and values for half-step control of a permanent
  440. magnet motor:
  441.  
  442.      const maxstep = 7;
  443.            steps = 8;
  444.      var   steptab: array [0..maxstep] of integer;
  445.            step: integer;
  446.            motor: file of integer; { this is the I/O port for the motor }
  447.      begin
  448.            step := 0;
  449.            steptab[0] = 1;  { binary 0001 }
  450.            steptab[1] = 5;  { binary 0101 }
  451.            steptab[2] = 4;  { binary 0100 }
  452.            steptab[3] = 6;  { binary 0110 }
  453.            steptab[4] = 2;  { binary 0010 }
  454.            steptab[5] = 10; { binary 1010 }
  455.            steptab[6] = 8;  { binary 1000 }
  456.            steptab[7] = 9;  { binary 1001 }
  457.            write( motor, steptab[step] );
  458.  
  459. The remainder of the code is the same and doesn't depend on the motor.
  460. The following procedure will advance the motor one step in either
  461. direction, where the direction parameter must be either +1 or -1 to
  462. indicate the direction.
  463.  
  464.      procedure onestep( direction: integer );
  465.      begin
  466.          step := step + direction;
  467.          if step > maxstep then step := 0
  468.          else if step < 0 then step := maxstep;
  469.          write( motor, steptab[step] );
  470.      end;
  471.  
  472. Software control of a stepping motor is a real-time task, and you need
  473. at least a bit of feedback.  One bit is enough; typically, this will be
  474. a bit indicating that a cam on the turntable (or whatever the motor is
  475. driving) is interrupting a light beam or closing a microswitch.  To avoid
  476. hysteresis problems in reading the position from this cam, you should
  477. only read zero to one transitions as indicating the home position when
  478. the motor is spinning in one direction.  Especially with switches
  479. or where gear trains are involved between the motor and the turntable,
  480. the one to zero transition in the other direction won't usually occur
  481. at exactly the same position.
  482.  
  483. Given that you can read the sense bit and that you have a programmable
  484. interval timer interrupt on your system, it is easy to make the timer
  485. interrupt service routine operate the motor as follows:
  486.  
  487.      const maxpos = 11111; { maxpos + 1 is calls to onestep per rev }
  488.      var position: integer; { current position of motor }
  489.          destination: integer; { desired position of motor }
  490.          direction: integer; { direction motor should rotate }
  491.          last: integer; { previous value from position sensor }
  492.          sensor: file of integer; { parallel input port }
  493.      begin
  494.          read( sensor, last );
  495.          position := 1;
  496.          setdest( 0, 1 ); { force turntable to spin on power-up until
  497.                             it finds it's home position }
  498.  
  499.      procedure timer; { interval timer interrupt service routine }
  500.      var sense: integer;
  501.      begin
  502.          read( sensor, sense );
  503.          if (direction = 1) and (last = 0) and (sense = 1)
  504.            then position = 0;
  505.          last := sense;
  506.  
  507.          if position <> destination then begin
  508.              onestep( direction );
  509.              position := position + direction;
  510.              if position > maxpos then position := 0
  511.              else if position < 0 then position := maxpos;
  512.          end;
  513.  
  514.          if position <> destination
  515.            then settimer( interval_until_next_step );
  516.      end;
  517.  
  518. The following procedure is the only procedure that user code should call.
  519. This procedure sets the destination position of the turntable and sets
  520. the direction of rotation, then sets the interval timer to force an
  521. immediate interrupt and lets the timer routine finish rotating the
  522. turntable while the applications program does whatever else it wants.
  523.  
  524.      procedure setdest( dst,dir: integer );
  525.      begin
  526.          destination := dst;
  527.          direction := dir;
  528.          if position <> destination
  529.            then settimer( min_interval ); { force a timer interrupt }
  530.      end;
  531.  
  532. If you want to control multiple stepping motors, it is easiest if you have
  533. one interval timers and one parallel port per motor.  If you hardware has
  534. only one timer, then you can use it to simulate multiple interval timers,
  535. but this is most of the way to the job of writing a real-time executive.
  536.  
  537. A final note:  If you try to step a motor too fast, it will slip and your
  538. software will lose track of the motor position.  Motors typically come
  539. with a rating that indicates a maximum number of steps per second, but
  540. you may not be able to accelerate the motor to that number of steps per
  541. second from a dead start without running it at a lower speed first.  This
  542. is especially true if the inertia of the load is fairly large, and in
  543. fact, with appropriate acceleration sequences, you can usually excede the
  544. maximum rated speed.
  545.  
  546. In the above code, interval_until_next_step is shown as a constant.  If
  547. you are dealing with high-inertia loads or very short intervals, you'll
  548. have to make this a variable, using longer intervals during starting and
  549. stopping to take care of accelerating and decelerating the motor.
  550.  
  551.